#ifndef __PRIORITY_H
#define __PRIORITY_H

#include <stdint.h>
#include <stdbool.h>

//最大优先级数可选值为：8，16，32，64
#define PRIORITY_LEVEL_MAX 8

//priority queue state
#define PQ_SUCCESS					0	//无错误
#define PQ_MALLOC_FAILED			1	//申请内存失败
#define PQ_PORTING_INIT_ERROR		2	//移植相关初始化错误
#define PQ_EXCEED_MAX_PRIORITY		3	//超过了可设置的最大优先级
#define PQ_PRIORITY_ALREADY_EXISTS	4	//该优先级已存在
#define PQ_FIFO_INIT_ERROR			5	//fifo初始化错误
#define PQ_IS_NOT_POWER_OF_2		6	//设定缓冲区大小不是2的幂次方
#define PQ_FIFO_WRITE_ERROR			7	//fifo写错误（可能fifo满）
#define PQ_FIFO_READ_ERROR			8	//fifo读错误（可能fifo空）
#define PQ_LOCK_ERROR				9	//锁错误
#define PQ_SEM_ERROR				10	//信号量错误

//queue type
enum pq_fifo_type {
	PQ_TYPE_FRAME,
	PQ_TYPE_STREAM
};

struct priority_queue_t;

/**
* @brief	初始化 priority_queue
* @param	__priority_queue： 作为queue句柄返回
* @retval	执行状态
*/
uint32_t priority_queue_init(struct priority_queue_t **__priority_queue);
/**
* @brief	添加优先级
* @param	_priority_queue： 对应 queue 句柄
* @param	prio： 要添加的优先级（数值越小优先级越高）
* @param	size： 此优先级对应队列的大小（必须为2的幂次方）
* @param	type： fifo的类型
* @retval	执行状态
*/
uint32_t priority_queue_add(struct priority_queue_t *_priority_queue, uint32_t prio, uint32_t size, enum pq_fifo_type type);
/**
* @brief	根据优先级向队列写入数据
* @param	_priority_queue： 对应 queue 句柄
* @param	prio： 待写入队列的优先级
* @param	pBuf： 待写入数据缓冲区
* @param	len： 待写入数据长度
* @retval	执行状态
*/
uint32_t priority_queue_in(struct priority_queue_t *_priority_queue, uint32_t prio, const uint8_t *pBuf, uint32_t len);
/**
* @brief	根据优先级读取队列数据
* @param	_priority_queue： 对应 queue 句柄
* @param	pBuf： 存储读出数据的缓冲区
* @param	len： 待读出数据缓冲区长度（type == PQ_TYPE_FRAME），欲读出的数据长度（type == PQ_TYPE_STREAM）
* @param	retLen： 实际读出的数据长度
* @retval	执行状态
*/
uint32_t priority_queue_out(struct priority_queue_t *_priority_queue, uint8_t *pBuf, uint32_t len, uint16_t *retLen);
/**
* @brief	销毁对应queue
* @param	_priority_queue： 对应 queue 句柄
* @retval	无
*/
void priority_queue_destroy(struct priority_queue_t *_priority_queue);
/**
* @brief	判空
* @param	_priority_queue： 对应 queue 句柄
* @retval	true：空，false：非空
*/
bool priority_queue_is_empty(struct priority_queue_t *_priority_queue);

#endif/*__PRIORITY_H*/
